package com.jsejtman.gastos.persistence.entity;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @author CayJu
 * 
 */
@Entity
@Table(name = "USUARIOS")
public class Usuario implements Identifiable<Long> {

	/**
	 * atributo del nombre de usuario.
	 */
	public static final String NOMBRE_USUARIO = "nombreDeUsuario";
	/**
	 * atributo de la baja lógica.
	 */
	public static final String BAJA_LOGICA = "bajaLogica";

	/**
	 * Id.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Long id;
	/**
	 * Nombre de usuario.
	 */
	@Column(name = "NOMBRE_DE_USUARIO", unique = true, nullable = false)
	private String nombreDeUsuario;
	/**
	 * Nombre y Apellido.
	 */
	@Column(name = "NOMBRE_APELLIDO", nullable = false)
	private String nombreApellido;
	/**
	 * Clave.
	 */
	@Column(name = "PASSWORD", nullable = true)
	private String password;
	/**
	 * email.
	 */
	@Column(nullable = true, name = "EMAIL")
	private String email;
	/**
	 * Baja logica.
	 */
	@Column(name = "BAJA_LOGICA", columnDefinition = "tinyint(1) NOT NULL DEFAULT '0'")
	private Boolean bajaLogica;
	/**
	 * gastos imputados.
	 */
	@ElementCollection(targetClass = Gasto.class, fetch = FetchType.LAZY)
	private Set<Gasto> gastosImputados;
	/**
	 * gastos cargados.
	 */
	@ElementCollection(targetClass = Gasto.class, fetch = FetchType.LAZY)
	private Set<Gasto> gastosCargados;

	/**
	 * getter de gastos imputados.
	 * 
	 * @return the gastosImputados.
	 */
	public final Set<Gasto> getGastosImputados() {

		return new HashSet<Gasto>(this.gastosImputados);
	}

	/**
	 * Setter de gastos imputados.
	 * 
	 * @param gastosImputados the gastosImputados to set.
	 */
	protected final void setGastosImputados(final Set<Gasto> gastosImputados) {

		this.gastosImputados = gastosImputados;
	}

	/**
	 * Agregar gasto imputado.
	 * 
	 * @param gastoImputado el gasto imputado.
	 */
	public final void addGastoImputado(final Gasto gastoImputado) {

		if (this.gastosImputados == null) {
			this.gastosImputados = new HashSet<Gasto>();
		}
		this.gastosImputados.add(gastoImputado);
	}

	/**
	 * Getter de gasto cargado.
	 * 
	 * @return the gastosCargados.
	 */
	public final Set<Gasto> getGastosCargados() {

		return new HashSet<Gasto>(this.gastosCargados);
	}

	/**
	 * Setter de gastos cargados.
	 * 
	 * @param gastosCargados the gastosCargados to set
	 */
	protected final void setGastosCargados(final Set<Gasto> gastosCargados) {

		this.gastosCargados = gastosCargados;
	}

	/**
	 * Agrega un gasto cargado.
	 * 
	 * @param gastoCargado el gasto.
	 */
	public final void addGastoCargado(final Gasto gastoCargado) {

		if (this.gastosCargados == null) {
			this.gastosCargados = new HashSet<Gasto>();
		}
		this.gastosCargados.add(gastoCargado);
	}

	/**
	 * getter de baja logica.
	 * 
	 * @return the bajaLogica
	 */
	protected final Boolean getBajaLogica() {

		return this.bajaLogica;
	}

	/**
	 * getter de nombre de usuario.
	 * 
	 * @return elnombre de usuario
	 */
	public final String getNombreDeUsuario() {

		return this.nombreDeUsuario;
	}

	/**
	 * setter de nombre de usuario.
	 * 
	 * @param nombreDeUsuario el nombre de susuario
	 */
	public final void setNombreDeUsuario(final String nombreDeUsuario) {

		this.nombreDeUsuario = nombreDeUsuario;
	}

	/**
	 * getter de nombre y apellido.
	 * 
	 * @return el nombre y apellido
	 */
	public final String getNombreApellido() {

		return this.nombreApellido;
	}

	/**
	 * Setter del nombre y apellido.
	 * 
	 * @param nombreApellido nombre y apellido.
	 */
	public final void setNombreApellido(final String nombreApellido) {

		this.nombreApellido = nombreApellido;
	}

	/**
	 * Getter de la password.
	 * 
	 * @return la password.
	 */
	public final String getPassword() {

		return this.password;
	}

	/**
	 * setter de la password.
	 * 
	 * @param password la password.
	 */
	public final void setPassword(final String password) {

		this.password = password;
	}

	/**
	 * getter del email.
	 * 
	 * @return el email.
	 */
	public final String getEmail() {

		return this.email;
	}

	/**
	 * setter del email.
	 * 
	 * @param email el email.
	 */
	public final void setEmail(final String email) {

		this.email = email;
	}

	/**
	 * getter de baja logica.
	 * 
	 * @return la baja logica.
	 */
	public final Boolean isBajaLogica() {

		return this.bajaLogica;
	}

	/**
	 * Setter de la baja logica.
	 * 
	 * @param bajaLogica la baja logica.
	 */
	public final void setBajaLogica(final Boolean bajaLogica) {

		this.bajaLogica = bajaLogica;
	}

	/**
	 * getter del id.
	 * 
	 * @return el id.
	 */
	public final Long getId() {

		return this.id;
	}

	/**
	 * Setter del id.
	 * 
	 * @param id el id.
	 */
	protected final void setId(final Long id) {

		this.id = id;
	}

}
